package com.hz.userService.controller;

import com.hz.apiService.model.request.ApiResponse;
import com.hz.userService.domain.User;
import com.hz.userService.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;


/**
 * @author LiiiYiAn
 * @version 1.0
 * @createDate 2023-09-23 19:42
 * @projectName SchoolServicePlatformFinal
 * @className UserManagerController
 * @description 控制器 - 用户管理
 */
@RestController
@RequestMapping("/user-manager")
@RequiredArgsConstructor  // 使用构造器自动注入
public class UserManagerController {

    private final UserService userService;


    /**
     * @param username 用户名
     * @param sex      性别
     * @param password 密码
     * @param realName 真实姓名
     * @param studentId 学号（6位）
     * @param userType 用户类型
     * @return java.lang.String 添加结果JSON格式
     * @author LiiiYiAn
     * @createDate 2023/9/24 17:58
     * @description 添加用户
     **/
    @PostMapping("/add-user")
    public String addUser(@RequestParam("username") String username, @RequestParam("sex") Integer sex,
                          @RequestParam("password") String password, @RequestParam("realName") String realName,
                          @RequestParam("studentId") String studentId, @RequestParam("userType") Integer userType) {
        // 添加用户
        int result = userService.addUser(username, realName, sex, studentId, password, userType);

        return result > 0 ? ApiResponse.ok(result) : ApiResponse.intError();
    }


    /**
     * @author LiiiYiAn
     * @createDate 2023/9/24 18:34
     * @description 删除指定ID用户（逻辑删除），并删除其Redis缓存
     * @param id 用户ID
     * @return java.lang.String 删除结果JSON格式
     **/
    @PostMapping("/delete-user")
    public String deleteUser(@RequestParam("id") Integer id) {
        // 删除用户
        int result = userService.deleteUserById(id);

        return result > 0 ? ApiResponse.ok(result) : ApiResponse.intError();
    }


    /**
     * @param user 用户对象
     * @return java.lang.String  编辑结果JSON格式
     * @author LiiiYiAn
     * @createDate 2023/9/24 18:05
     * @description 编辑用户（用户个人可编辑数据范围），并更新其存储到Redis的缓存
     **/
    @PostMapping("/edit-user")
    public String editUser(User user) {
        String result = userService.updateUser(user);

        return result != null ? ApiResponse.ok(result) : ApiResponse.intError();
    }


    /**
     * @param id 用户ID
     * @return java.lang.String 查找用户信息JSON格式
     * @author LiiiYiAn
     * @createDate 2023/9/24 15:24
     * @description 查找指定ID的用户，并将其存储到Redis缓存
     **/
    @GetMapping("/view-user")
    public String selectUserById(@RequestParam("id") Integer id) {
        // 用户查询，查询成功返回查询用户信息JSON格式
        String result = userService.findUserById(id);

        return result != null ? ApiResponse.ok(result) : ApiResponse.intError();
    }

    /**
     * @author LiiiYiAn
     * @createDate 2023/10/4 22:26
     * @description 查找用户信息JSON格式
     * @param username 用户名
     * @return java.lang.String 查找指定用户名的用户，并将其存储到Redis缓存
     **/
    @GetMapping("/view-user-by-username")
    public String selectUserByUsername(@RequestParam("username") String username) {
        // 用户查询，查询成功返回查询用户信息JSON格式
        String result = userService.findUserByUsername(username);

        return result != null ? ApiResponse.ok(result) : ApiResponse.intError();
    }


    /**
     * @author LiiiYiAn
     * @createDate 2023/9/24 21:05
     * @description 修改密码，将修改结果更新到Redis缓存
     * @param id 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @param newPassword2 再次输入新密码
     * @return String 修改结果
     **/
    @PostMapping("/change-password")
    public String changeUserPassword(@RequestParam("id") Integer id, @RequestParam("oldPassword") String oldPassword,
                                     @RequestParam("newPassword") String newPassword, @RequestParam("newPassword2")  String newPassword2) {
        int result = userService.changePasswordById(id, oldPassword, newPassword, newPassword2);

        switch (result) {
            case 1: return "旧密码匹配失败";
            case 2: return "两次输入的新密码不一致";
            default: return "修改成功";
        }
    }
}
